/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pio.action.aspirante;

import DBMS.DataBaseManager;
import Negocio.Negocio;
import clases.Aspirante;
import clases.Fecha;
import clases.Institucion;
import clases.Parada;
import clases.Periodo;
import clases.Preinscrito;
import clases.Turno;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

/**
 *
 * @author andreth
 */
public class Redirect extends DispatchAction {

    /*
     * Antes de que comienze el sistema
     */
    private final String antesValidacionDatosTest = "antesValidacionDatosTest";
    /*
     * Validando sus datos y realizando el test vocacional
     */
    private final String validacionDatosTest = "validacionDatosTest";
    /* Viendo mensaje de test completado 
     * sin oportunidad de rehacerlo 
     */
    private final String antesEntregaResultadosTest = "antesEntregaResultadosTest";
    /* Viendo la informacion de la prueba
     * 
     */
    private final String informacionPrueba = "informacionPrueba";
    /*
     * Completando inscripcion
     */
    private final String completarInscripcion = "completarInscripcion";
    /*
     * Viendo mensaje de inscripcion completa o tiempo pasado
     */
    private final String despuesInscripcion = "despuesInscripcion";
    /*
     * Errores
     */
    private final String error = "error";
    private final String promedioRechazado = "promedioRechazado";
    private final String sintest = "sintest";
    private final String noseleccionado = "noseleccionado";
    private final String noaceptado = "noaceptado";

    public ActionForward validar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        /*
         * Accion para redireccionar a un aspirante dependiendo del periodo de tiempo
         * Siguiendo la logica impuesta por los datos de la tabla Periodo
         * 
         *  Fecha 1 Fecha de inicio de validación de datos y presentación del test vocacional por parte del aspirante.
         *  Fecha 2 Fecha de cierre de validación de datos y presentación del test vocacional por parte del aspirante.
         *  Fecha 3 Fecha de publicación de resultados del test vocacional e informe de datos para presentar prueba de admisión PIO
         *  Fecha 4 Fecha de inicio de Inscripcion
         *  Fecha 5 Fecha de cierre de Inscripcion
         */
        List<Periodo> pl = DataBaseManager.getInstance().consultarPeriodo(new Periodo());
        Periodo p = (pl.size() > 0 ? pl.get(0) : null);
        if (p == null) {
            System.out.println("El periodo llego nulo");
            return mapping.findForward(error);
        }

        Aspirante aspirante = (Aspirante) form;

        System.out.println("Llego un aspirante" + aspirante.toString() + aspirante.getCedula());
        Aspirante a = DataBaseManager.getInstance().consultarAspirante(aspirante);
        if (a == null) {
            return mapping.findForward(error);
        }
        double promedio = (aspirante.getPromedio() != null ? aspirante.getPromedio() : 0.0);
        if (promedio < 12.50 && promedio != 0.0) {
            aspirante.setMensaje("Promedio Menor a 12.5");
            request.setAttribute("Aspirante", aspirante);
            return mapping.findForward(promedioRechazado);
        } else if (aspirante.getPromedio() == null || aspirante.getPromedio() == 0.0) {
            aspirante.setMensaje("No se tiene informacion de su promedio, consulte a su coordinador");
            request.setAttribute("Aspirante", aspirante);
            return mapping.findForward(promedioRechazado);
        }

        /*
         * Entero que representa el intervalo de tiempo para las funciones de aspirante
         *  dependiendo del proceso adecuado
         */
        Integer intervalo;
        /* Proceso: Validacion de datos y test
         * 
         */
        intervalo = Fecha.compararFechas(p.getFechaInicioPreinscripcion(), p.getFechaCierrePreinscripcion());
        if (intervalo == -1) {
            // Antes
            return mapping.findForward(antesValidacionDatosTest);
        } else if (intervalo == 0) { //Durante
            if (aspirante.getDatosCompletos()) { //ya hizo test
                return mapping.findForward(antesEntregaResultadosTest);
            } else {
                return mapping.findForward(validacionDatosTest);
            }
        } else if (intervalo == 1) {
            // Despues No hacemos nada porque se evalua luego
        }
        /*
         * Proceso: Ver resultados de test y fechas de pruebas
         * 
         */
        intervalo = Fecha.compararFechas(p.getFechaCierrePreinscripcion(), p.getFechaPublicacionResultadosVocacional());
        if (intervalo == -1) {
            // Antes
            if (aspirante.getDatosCompletos()) {
                return mapping.findForward(antesEntregaResultadosTest);
            } else {
                aspirante.setMensaje("No se encuentra un test para su cedula");
                request.setAttribute("Aspirante", aspirante);
                return mapping.findForward(sintest);
            }
        } else if (intervalo == 0) {
            // Durante pero antes
            if (aspirante.getDatosCompletos()) {
                return mapping.findForward(antesEntregaResultadosTest);
            } else {
                aspirante.setMensaje("No se encuentra un test para su cedula");
                request.setAttribute("Aspirante", aspirante);
                return mapping.findForward(sintest);
            }
        } else if (intervalo == 1
                && Fecha.compararFechas(p.getFechaInicioInscripcion(), p.getFechaCierreInscripcion()) == -1) {
            // Despues pero todavia sin iniciar la inscripcion
            if (!aspirante.getDatosCompletos()) {
                aspirante.setMensaje("La informacion de prueba no esta disponible para usted");
                request.setAttribute("informacionPrueba", aspirante);
                return mapping.findForward(sintest);
            }
            DataBaseManager dbms = DataBaseManager.getInstance();
            if (Negocio.testAprobado(a)) {
                System.out.println("El aspirante" + a.getCedula() + "Tiene test aprobado");
                System.out.println(informacionPrueba);
                Preinscrito pre = new Preinscrito();
                pre.setCedula(a.getCedula());
                pre = dbms.consultarPreinscritos(pre).get(0);
                for (Turno t : dbms.consultarTurno(new Turno())) {
                    if (t.getId() == pre.getTurnoPrueba()) {
                        System.out.println("Seteando el Turno" + t.getSede());
                        request.setAttribute("tur", t);
                        break;
                    }
                }
                for (Institucion insti : dbms.consultarInstitucion(new Institucion())) {
                    if (pre.getInstitucionId() == insti.getId()) {
                        for (Parada pa : dbms.consultarParada(new Parada())) {
                            System.out.println("ID parada" + pa.getId());
                            System.out.println("ID INST " + insti.getIdParada());
                            System.out.println("Match " + (insti.getIdParada() == pa.getId()));
                            if (insti.getIdParada().equals(pa.getId())) {
                                System.out.println("Obteniendo las paradas");
                                System.out.println("Seteando la parada" + pa.getNombre());
                                request.setAttribute("par", pa);
                                break;
                            }
                        }

                        System.out.println("Seteando la institucion" + insti.getNombre());
                        request.setAttribute("inst", insti);
                        break;
                    }

                }

                System.out.println("Seteando el preinscrito" + pre.getCedula());
                request.setAttribute("pre", pre);
                return mapping.findForward(informacionPrueba);
            } else {
                System.out.println();
                return mapping.findForward(noseleccionado);
            }
        }
        /*
         * Proceso: Ver resultados de pruebas e inscribirse
         */
        intervalo = Fecha.compararFechas(p.getFechaInicioInscripcion(), p.getFechaCierreInscripcion());
        if (intervalo == -1) {
            // Antes de la preinscripcion
            if (!aspirante.getDatosCompletos()) {
                aspirante.setMensaje("La informacion de prueba no esta disponible para usted");
                request.setAttribute("Aspirante", aspirante);
                return mapping.findForward(sintest);
            }
            DataBaseManager dbms = DataBaseManager.getInstance();
            if (Negocio.testAprobado(a)) {
                System.out.println("El aspirante" + a.getCedula() + "Tiene test aprobado");
                System.out.println(informacionPrueba);
                Preinscrito pre = new Preinscrito();
                pre.setCedula(a.getCedula());
                pre = dbms.consultarPreinscritos(pre).get(0);
                for (Turno t : dbms.consultarTurno(new Turno())) {
                    if (t.getId() == pre.getTurnoPrueba()) {
                        System.out.println("Seteando turno" + t.getSede() + t.getId());
                        request.setAttribute("tur", t);
                        break;
                    }
                }
                for (Institucion insti : dbms.consultarInstitucion(new Institucion())) {
                    if (pre.getInstitucionId() == insti.getId()) {
                        for (Parada pa : dbms.consultarParada(new Parada())) {
                            if (insti.getIdParada().equals(pa.getId())) {
                                System.out.println("Obteniendo las paradas");
                                System.out.println("Setenado las parada" + pa.getNombre());
                                request.setAttribute("par", pa);
                                break;
                            }
                        }

                        System.out.println("Setenado las institucion" + insti.getNombre());
                        request.setAttribute("inst", insti);
                        break;
                    }
                }
                System.out.println("Seteando el preinscrito" + pre.getCedula());
                request.setAttribute("pre", pre);
                return mapping.findForward(informacionPrueba);
            } else {
                System.out.println();
                return mapping.findForward(noseleccionado);
            }
        } else if (intervalo == 0) {
            Preinscrito pre = new Preinscrito();
            pre.setCedula(a.getCedula());
            pre.setNombres(a.getNombres());
            pre.setApellidos(a.getApellidos());
            DataBaseManager db = DataBaseManager.getInstance();
            if (db.preinscritoAceptado(pre)) {
                return mapping.findForward(completarInscripcion);
            } else {
                request.setAttribute("Preinscrito", pre);
               return mapping.findForward(noaceptado);
            }
        } else if (intervalo == 1) {
            return mapping.findForward(despuesInscripcion);
        }
        return mapping.findForward(error);
    }

    public ActionForward presentar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Aspirante aspirante = (Aspirante) form;
        if (aspirante.getDatosCompletos() != null) {
            return mapping.findForward("presentar");
        } else {
            return mapping.findForward("nopresentar");
        }
    }
}
